﻿// PStorage.h: CPStorage 的声明

#pragma once
#include "resource.h"       // 主符号



#include "ServCom_i.h"



#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”，原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif

using namespace ATL;


// CPStorage

class ATL_NO_VTABLE CPStorage :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CPStorage, &CLSID_PStorage>,
    public IDispatchImpl<IPStorage, &IID_IPStorage, &LIBID_ServComLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IPersistPropertyBagImpl<CPStorage>,
    public IPersistStorageImpl<CPStorage>,
    public IPersistStreamInitImpl<CPStorage>
{
private:
    BSTR m_lpbString;

public:
    BOOL m_bRequiresSave;

public:
    CPStorage()
    {
        m_lpbString = nullptr;
    }

    DECLARE_REGISTRY_RESOURCEID(106)


    BEGIN_COM_MAP(CPStorage)
        COM_INTERFACE_ENTRY(IPStorage)
        COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY(IPersistPropertyBag)
    END_COM_MAP()

    //
    //  __if_not_exists(__ATL_PROP_NOTIFY_EVENT_CLASS) 
	//  { 
	//  	typedef ATL::_ATL_PROP_NOTIFY_EVENT_CLASS __ATL_PROP_NOTIFY_EVENT_CLASS; 
	//  } 
    //
    //  typedef theClass _PropMapClass; 
    //
    //  static const ATL::ATL_PROPMAP_ENTRY* GetPropertyMap()
	//  {
	//      static const ATL::ATL_PROPMAP_ENTRY pPropMap[] =
	//      {
    //

    BEGIN_PROP_MAP(CPStorage)

    //
    //          {OLESTR(szDesc), &clsid, &iidDispatch, NULL, 0, dispid, 0, 0, vt},
    //

        PROP_ENTRY_TYPE_EX("PStorage", 1, CLSID_NULL, IID_IPStorage, VT_BSTR)

    //
    //          {NULL, NULL, &IID_NULL, NULL, 0, 0, 0, 0, 0}
    //      };
    //      return pPropMap;
    //  }
    //

    END_PROP_MAP()

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        m_lpbString = SysAllocString(L"Init");
        return S_OK;
    }

    void FinalRelease()
    {
        SysFreeString(m_lpbString);
    }

public:
    STDMETHOD(get_bString)(BSTR* pVal);
    STDMETHOD(put_bString)(BSTR newVal);
};

OBJECT_ENTRY_AUTO(__uuidof(PStorage), CPStorage)
